;int descomprimir_buffer(unsigned char *src_buf, unsigned int long_codificacion, unsigned char *dst_buf, unsigned int dst_size, codigo_t *tabla_codigo);
%include "macros/personalizada.mac"
%include "macros/nodo_arbol_t.mac"

extern cargar_arbol_huffman
extern liberar_arbol

global descomprimir_buffer

%define ptr_src_buf_actual [ebp - 8]
%define ptr_nodo_arbol [ebp - 4]
%define ptr_src_buf [ebp + 8]
%define long_codificacion [ebp + 12]
%define ptr_dst_buf [ebp + 16]
%define dst_size [ebp + 20]
%define ptr_tabla_codigos [ebp + 24]

section .text

descomprimir_buffer:
	push ebp
	mov ebp, esp
	sub esp, 8
	push esi
	push edi
	push ebx
	
	mov eax, ptr_tabla_codigos
	lea ecx, ptr_nodo_arbol
	mov dword [ecx], 0
	push ecx
	push eax
	call cargar_arbol_huffman
	add esp, 8
	cmp eax, error_code
	je error
	
	xor eax, eax ; 
	mov edx, ptr_nodo_arbol
	mov edi, ptr_dst_buf ; edi = ptr dst buffer.
	mov esi, ptr_src_buf ; esi = ptr src buffer.
	mov ptr_src_buf_actual, esi
	
	mov esi, long_codificacion ; esi = longitud de la codificacion.
	
ciclo:
	cmp esi, 0
	je termine
	
	mov ecx, ptr_src_buf_actual
	mov ebx, [ecx]
	add ecx, 4
	mov ptr_src_buf_actual, ecx
	
	mov ecx, 32
ciclo2:
	cmp esi, 0
	je termine
	
	cmp ecx, 0
	je ciclo
	
	rcr ebx, 1
	jnc sigo_der
	
sigo_izq:	
	mov edx, [edx + off_ptr_izq_na]
	jmp es_hoja
	
sigo_der:
	mov edx, [edx + off_ptr_der_na]
	
es_hoja: ;Aca verificamos si es hoja	
	dec ecx
	dec esi
	cmp dword [edx + off_valido_na], valido
	jne ciclo2
	
	mov al, [edx + off_simbolo_na]
	mov [edi], al
	add edi, 1
	mov edx, ptr_nodo_arbol ; Me restaura el puntero al principio del arbol.
	
	jmp ciclo2

termine:
	; Liberamos la memoria del arbol huffman.
	mov edx, ptr_nodo_arbol
	push edx
	call liberar_arbol
	add esp, 4
	
	xor eax, eax ; La funcion se ejecuto con exito.
	
	jmp fin
	
error:
	mov eax, error_code
	
fin:
	pop ebx
	pop edi
	pop esi
	add esp, 8
	pop ebp
	ret
